import matplotlib.pyplot as plt
import numpy as np
import pandas  as pd
import matplotlib as mpl
mpl.use('TkAgg')  # 出图设置
plt.rcParams['font.sans-serif'] = 'SimSun'#宋体设置
plt.rcParams['axes.unicode_minus'] = False   # 字符显示


# # 基础作图
# data = np.random.normal(0, 4, 100)  # 0 是均值 4 是标准差 ,100为个数
#
# fig = plt.figure(figsize=(8, 8))
# ax1 = fig.add_subplot(221)
# ax1.set_title('图1 常规作图')
# ax1.boxplot(data)
#
# muti_data = [np.random.normal(0, std, 100) for std in range(1, 4)]
# ax2 = fig.add_subplot(222)
# ax2.set_title('图2 多图绘制')
# ax2.boxplot(muti_data)
#
# ax3 = fig.add_subplot(223)
# ax3.set_title('图3 水平箱线图')
# ax3.boxplot(data, vert=False)  # 代表是水平
#
# ax4 = fig.add_subplot(224)
# ax4.set_title('图4 中间凹陷')
# ax4.boxplot(data, notch=True)
#
# plt.show()



# # 修改标签
# data=np.random.normal(0,4,100)
#
# fig = plt.figure(figsize=(8, 4))
# muti_data=[np.random.normal(0,std,100) for std in range(1,4)]
# ax2 = fig.add_subplot(121)
# ax2.set_title('图1')
# ax2.boxplot(muti_data, labels=['第1组', '第2组', '第3组'])
#
# muti_data=[np.random.normal(0,std,100) for std in range(1,4)]
# ax2 = fig.add_subplot(122)
# ax2.set_title('图2')
# ax2.boxplot(muti_data, vert=False, labels=['第1组', '第2组', '第3组'])
#
# plt.show()


# # 显示均值
# data=np.random.normal(0,4,100)
#
# fig = plt.figure(figsize=(8, 4))
# muti_data=[np.random.normal(0,std,100) for std in range(1,4)] # 太多分布
# ax2 = fig.add_subplot(121)
# ax2.set_title('图1')
# ax2.boxplot(muti_data, labels=['第1组', '第2组', '第3组'], showmeans=True)  # 显示均值，默认以点的方式显示
#
# muti_data=[np.random.normal(0,std,100) for std in range(1,4)]
# ax2 = fig.add_subplot(122)
# ax2.set_title('图2')
# ax2.boxplot(muti_data, labels=['第1组', '第2组', '第3组'], showmeans=True, meanline=True)  # 显示均值，并以横线方式显示
#
# plt.show()


# 箱体设置
# import numpy  as np
# data=np.random.normal(0,4,100)
#
# fig = plt.figure(figsize=(8, 4))
# muti_data=[np.random.normal(0,std,100) for std in range(1,4)]
# ax2 = plt.axes()
# ax2.set_title('图1')
# box_dict = ax2.boxplot(muti_data, labels=['第1组', '第2组', '第3组'],  patch_artist=True)  # 注意，patch_artist一定要设置为True，下面的设置才会生效
#
# box_dict.get('boxes')[0].set_color('red')  # 箱体边框颜色
# box_dict.get('boxes')[1].set_color('blue')
# box_dict.get('boxes')[2].set_color('green')
# plt.show()


# 案例
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False   # 设置中文、负号正常显示
plt.style.use("ggplot")  #使用ggplot的图形style



train = pd.read_csv(r'./titanic.csv')
train.age.isnull().any()  #检查年龄是否有缺失
train.dropna(inplace=True)  #删除含有缺失年龄的观测，即行  subset参数指定列名




plt.figure(figsize=(5,6))
plt.boxplot(x = train.age,     # 绘图数据
            notch = True,      #设置中位线处凹陷，（注意：下图看起来有点丑）
            patch_artist=True, # 设置用自定义颜色填充盒形图，默认白色填充
            showmeans=True,    # 以点的形式显示均值
            boxprops = {"color":"black","facecolor":"#F43D68"}, # 设置箱体属性，填充色and 边框色
            flierprops = {"marker":"o","markerfacecolor":"#59EA3A","color":"#59EA3A"}, # 设置异常值属性，点的形状、填充色和边框色
            meanprops = {"marker":"D","markerfacecolor":"white"}, # 设置均值点的属性，点的形状、填充色
            medianprops = {"linestyle":"--","color":"#FBFE00"}         # 设置中位数线的属性，线的类型和颜色
            )

plt.title("乘客年龄箱线图",fontsize="xx-large",color="#DE0052")
plt.tick_params(top="off", right="off")  # 去掉o箱线图的上方及右方边框的刻度标签
plt.show()   # 显示图形，jupyter notebook有另一种写法，可以不用每一次画图都码这句